package ${package}.tq;

import java.io.IOException;
import java.util.logging.Logger;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.slim3.datastore.Datastore;

import com.google.appengine.api.datastore.Key;
import com.google.appengine.api.mail.MailServiceFactory;
import com.google.appengine.api.mail.MailService.Message;
import com.google.apphosting.api.ApiProxy;
import ${package}.cron.CheckMentions;
import ${package}.model.Mention;
import ${package}.service.MentionService;
import ${package}.service.SettingService;

/**
 * cronで取得された新規のmentionひとつを処理する。
 * <p>このサンプルではデータストアに保存されたmentionの内容をアプリケーション管理者にメールを送信する。</p>
 * @author shin1ogawa
 * @see CheckMentions
 */
@SuppressWarnings("serial")
public class ProcessMention extends HttpServlet {

	static final Logger logger = Logger.getLogger(ProcessMention.class.getName());


	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) {
		String encodedKey = req.getParameter("encodedKey");
		if (StringUtils.isEmpty(encodedKey)) {
			logger.warning("encodedKeyが渡されていません。");
			return;
		}
		// 渡されたencodedKeyからKeyを復元し、処理対象のmentionをデータストアから読み込む。
		Key key = Datastore.stringToKey(encodedKey);
		Mention mention = MentionService.get(key);
		if (mention == null) {
			logger.warning("keyに対応するmentionが取得できません。key=" + key.toString());
			return;
		}
		// mentionに対するいろんな処理を行う。例えばこのサンプルではアプリケーション管理者にメールするとか。
		logger.info("mentionsを処理します。encodedKey=" + encodedKey + ", mention="
				+ ToStringBuilder.reflectionToString(mention));
		Message message = new Message();
		message.setSender(SettingService.get("mailSender"));
		message.setSubject("[" + ApiProxy.getCurrentEnvironment().getAppId() + "] mentionが届いています");
		message.setTextBody(new StringBuilder().append("createdAt:").append(mention.getCreatedAt())
			.append("\n").append("from:").append(mention.getUserScreenName()).append("\n").append(
					"text:").append("\n").append(mention.getText()).toString());
		try {
			// アプリケーション管理者にmentionの情報をメールで送信する。
			MailServiceFactory.getMailService().sendToAdmins(message);
		} catch (IOException e) {
			// メールの送信に失敗。500を返すことで自動的にリトライされる。
			resp.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
		}
	}
}
